package br.com.post.action;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import br.com.post.model.Profile;
import br.com.post.model.Schooling;
import br.com.post.model.User;
import br.com.post.persistence.ProfileDao;
import br.com.post.persistence.SchoolingDao;
import br.com.post.persistence.UserDao;

public class UserAction extends SuperAction {
	
	private static final long serialVersionUID = 1L;
	private User user;
	private List<Schooling> listSchooling;
	private List<User> userList;
	private List<Profile> listprofile;
	private SchoolingDao schoolingDao = SchoolingDao.getInstance();
	private UserDao userDao = UserDao.getInstance(); 
	private ProfileDao profileDao = ProfileDao.getInstance();
	private String login;
	private String password;
	private String confpass;
	
	
	/**
	 * Adiciona o usuário no banco
	 * @return SUCCESS
	 */
	public String addUser() {
		try {
			if(user==null)return INPUT;
			// Faz as validacoes do usuario vindo do formaddUser.jsp
			try {
				validarUser(user) ;
			}catch (Exception e) {
				e.printStackTrace();
				addActionError("Usuário não validado, corrija os erros !");
				return INPUT;
			}
			//Usuario padrão, sem administracao
			if (user.getUser_profile() == null || user.getUser_profile().getProfile_id() == 0)
				user.setUser_profile(new Profile(3));
			
			//Por padrão é desativado, até ser realizada a ativação pelo email
			user.setUser_active(false);
			user.setUser_date_register(new Date());
			userDao.createUser(user);
			//envia email de validação
			sendEmailValidation(user);
			return SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			return INPUT;
		}
	}
	
	/**
	 * Carrega o form para  cadastro do usuário
	 * @return
	 */
	public String loadUserAdd() {
		setListSchooling(schoolingDao.getList());
		User usersession = (User)getRequest().getSession().getAttribute(USER_SESSION);
		if(usersession != null && usersession.getUser_profile().getProfile_id()== 1)
			setListprofile(profileDao.getList());
		if (user==null) {
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			getRequest().setAttribute("data", sdf.format(new Date()));
			user = new User();
			user.setUser_name(getText("default.nome"));
			user.setUser_nick(getText("default.apelido"));
			user.setUser_email(getText("default.email"));
		}
		return SUCCESS;
	}
	
	/**
	 * Remove o usuário do banco
	 * @return
	 */
	public String removeUser(){
		userDao.deleteUser(user.getUser_id());
		return SUCCESS;
	}
	
	/**
	 * Lista os usuários
	 * @return
	 */
	public String loadAllUsers(){
		setUserList(userDao.getList());
		return SUCCESS;
		
	}
	/**
	 * Verifica o Login e se o usuário estiver correto coloca-o na sessão
	 * @return
	 */
	public String checkLogin()	{
		
		if (login.equals("") || login.equals("Digite o Login") ||login==null || password.equals("") || password==null || password.equals("senhasenha"))
			return INPUT;
		try {
			user=userDao.selectUserByLoginPass(login,password);
		} catch(Exception e) {
			addActionError("ERRO AO ENTRAR");
			return INPUT;
		}
		if (user==null){
			addActionError("O usuário não existe ou sua senha e login estão errados!");
			return INPUT;
		}
		
		// coloca o usuário na sessão (sem esconder a senha(BIZARRO), colocar MD5 aqui e no banco)
		getRequest().getSession().setAttribute(USER_SESSION,user);
		
		addActionMessage("ENTROU COM SUCESSO");
		
		return SUCCESS;
	}
	
	/**
	 * Faz o logout do usuario
	 * @return SUCCESS
	 */
	public String logout(){
		getRequest().getSession().setAttribute(USER_SESSION,null);
		return SUCCESS;
	}
	/**
	 * carrega o usuário para atualizar
	 * @return
	 */
	public String loadUpdateUser(){
		setListSchooling(schoolingDao.getList());
		user = (User)getRequest().getSession().getAttribute(USER_SESSION);
		return SUCCESS;
	}
	
	/**
	 * Atualiza o usuario 
	 * @return
	 */
	public String updateUser() {
		User userold = userDao.selectUser(user.getUser_id());
		user.setUser_date_register(userold.getUser_date_register());
		userDao.updateUser(user);
		getRequest().getSession().setAttribute(USER_SESSION,user);
		return SUCCESS; 
	}
	
	/**
	 * Valida os dados de usuario e guarda os erros em fieldErrors
	 * @param userVal
	 * @throws Exception
	 */
	public void validarUser(User userVal) throws Exception{
		
		if (userVal.getUser_name()==null || user.getUser_name().equals("")) 
			addFieldError("user_name","Nome não preenchido corretamente!");
		
		if (userVal.getUser_nick()==null || userVal.getUser_nick().equals(""))
			addFieldError("user_nick","Nick não preenchido corretamente!");
		
		if (userVal.getUser_email()==null || userVal.getUser_email().equals("") || !userVal.getUser_email().contains("@")) 
				addFieldError("user_mail","Email não é válido ou não foi preenchido!");
		else{
			if (getUserDao().selectUserByEmail(userVal.getUser_email()) != null)
				addFieldError("user_mail","Este email já está em uso, por favor utilize outro email!");
		}
		
		if(userVal.getUser_schooling().getSchooling_id() ==  0)
			addFieldError("user_schooling","A escolaridade não foi preenchida!");
		
		if (userVal.getUser_password() == null || userVal.getUser_password().equals("") || !userVal.getUser_password().equals(confpass))
			addFieldError("user_password","Senha ou confirmação de senha não preenchidas corretamente!");
		
		if (getFieldErrors().size() > 0) 
			throw new Exception();
	}
	
	/**
	 * Envia um email para validar o email do usuário, para ativar sua conta
	 * @param user, o qual será enviado o email
	 */
	public void sendEmailValidation(User user) {
		//CRIAR O EMAIL 
	}
	
	public List<Schooling> getListSchooling() {
		return listSchooling;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public void setListSchooling(List<Schooling> listSchooling) {
		this.listSchooling = listSchooling;
	}
	public List<User> getUserList() {
		return userList;
	}

	public void setUserList(List<User> userList) {
		this.userList = userList;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	
	public String getConfpass() {
		return confpass;
	}
	
	public void setConfpass(String confpass) {
		this.confpass = confpass;
	}
	
	public SchoolingDao getSchoolingDao() {
		return schoolingDao;
	}
	
	public void setSchoolingDao(SchoolingDao schoolingDao) {
		this.schoolingDao = schoolingDao;
	}
	
	public UserDao getUserDao() {
		return userDao;
	}
	
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	public List<Profile> getListprofile() {
		return listprofile;
	}
	public void setListprofile(List<Profile> listprofile) {
		this.listprofile = listprofile;
	}
	
	
	
}
